/*
更新内容：
1.通过对象自带get,set 设置血量，让血量不能为负数
2.通过构造函数方式从写英雄对象
3.通过属性设置，Object.defineProperty设置对象的姓名，口号等。
*/

function Hero(name, hp, mp, hj, gjl, skills, kh) {
    //定义一个私有属性_hp，不向外暴露，只是由于内部调用，外部用hp去调用，和下面的Object.defineProperties配合
    this._hp = hp;
    this.mp = mp;
    this.hj = hj;
    this.gjl = gjl;
    this.skills = skills;
    this.kh = kh;
    //初始化防御值，护甲越高防御值越高，如护甲为50防御值为0.1
    this.wlfy = this.hj / 500
        //随机打印一个口号
    this.say = function() {
            //i是一个随机数
            var i = Math.round(Math.random() * (this.kh.length - 1))
            console.log(this.kh[i])
        }
        //攻击方法，对方英雄通过hero参数传入
    this.attack = function(hero) {
            //在攻击之前首先判断对方英雄的血量，如果<=0就不进行攻击。
            if (hero.hp <= 0) {
                console.log(`${hero.name}已经挂了，不要在鞭尸了！`);
                //return以后的代码都不执行
                return
            }
            //调用打印口号函数
            this.say();
            //每次攻击损失的血量，物理防御值约大损失的血量约小，但物理防御值趋近1时候，根本打不动
            var loss = this.gjl * (1 - hero.wlfy)
                //对方英雄血量减少
            hero.hp -= loss;
            //攻击之后如果对方英雄的血量小于0则置为0
            console.log(`${this.name}攻击了${hero.name}`);
            console.log(`${hero.name}减少血量${loss}，剩余血量${hero.hp}`);
            if (hero.hp <= 0) {
                console.log(`${hero.name}挂了`)
            }
        }
        //配置对象的属性
    Object.defineProperties(this, {
        //配置对象的hp属性
        hp: {
            //当获取对象的hp时调用此函数
            get() { return this._hp },
            //单设置对象的hp时调用此函数，n就是等号右边的值
            set(n) {
                if (n <= 0) { this._hp = 0 } else {
                    this._hp = n
                }
            }
        },
        //配置对象的name属性
        name: {
            //不可以写
            writable: false,
            // 不可以删除
            configurable: false,
            //name属性的默认值是形参传入的name
            value: name
        }
    })
}


// var a = { name: 'lily', age: 20 }
// var b = { age: 20, name: 'lily' }
// var array = ['a', 'b', 'c', 'd']

// var array1 = {
//     0: 'a',
//     1: 'b',
//     2: 'c',
//     3: 'd',
//     length: 4,
//     forEach(cb){
//         cb()
//     }
// }
// Object.defineProperty(array1, 'length', {
//     enumerable: false
// })
// Object.defineProperty(array1, 'forEach', {
//     enumerable: false
// })
// for (var i = 0; i < array1.length; i++) {
//     console.log(array1[i])
// }